package dibujo;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;

import org.uc3m.ed.interfaz_grafica.ventana.VentanaPrincipal;

public class NodoNulo {

	/**
	 * 
	 */
	private Graphics _grafico;
	
	/**
	 * 
	 */
	private int _posicionX;
	
	/**
	 * 
	 */
	private int _posicionY;
	
	/**
	 * 
	 */
	private int _anchoNodo;
	
	/**
	 * 
	 */
	private int _altoNodo;
	
	/**
	 * 
	 */
	private NodoDibujo _primero;
	
	
	/**
	 * @param grafico
	 */
	public NodoNulo(Graphics grafico){
		_grafico=grafico;
		_anchoNodo=70;
		_altoNodo=100;
		_primero=null;
		_posicionX=50;
		_posicionY=100;

	}
	
	/**
	 * 
	 */
	public void crearNodo()
	{
		try{
		crearCentinela();
		crearCuerpo();
		crearApuntamientoSiguiente();
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::NodoNulo ERROR::1\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::NodoNulo ERROR::2\n   Se ha producido un Error: "+e.toString());
		}
	}
	
	/**
	 * 
	 */
	private void crearApuntamientoSiguiente()throws Exception,Error  {
		
		if(_primero==null)
		{
			_grafico.setColor(new Color (193,203,21));
			_grafico.drawLine(_posicionX+_anchoNodo,_posicionY+(_altoNodo/8),_posicionX+_anchoNodo+30,_posicionY+(_altoNodo/8));
			_grafico.drawLine(_posicionX+_anchoNodo+30,_posicionY+(_altoNodo/8),_posicionX+_anchoNodo+30,_posicionY+_altoNodo+20);
			_grafico.drawLine(_posicionX+_anchoNodo+30,_posicionY+_altoNodo+20,_posicionX+(_anchoNodo/2),_posicionY+_altoNodo+20);
			_grafico.drawLine(_posicionX+(_anchoNodo/2),_posicionY+_altoNodo+20,_posicionX+(_anchoNodo/2),_posicionY+_altoNodo-15);
			_grafico.fillPolygon(RellenarFlechaArriba(new Point(_posicionX+(_anchoNodo/2),_posicionY+_altoNodo-15)));
			
		}
		else
		{
			_grafico.setColor(new Color (142,45,67));
			_grafico.drawLine(_posicionX+_anchoNodo,_posicionY+(_altoNodo/8),_primero.getPosicionX()-20,_primero.getPosicionY()+(_primero.getAltoNodo()/2));
			_grafico.drawLine(_primero.getPosicionX()-20,_primero.getPosicionY()+(_primero.getAltoNodo()/2),_primero.getPosicionX()-5,_primero.getPosicionY()+(_primero.getAltoNodo()/2));
			_grafico.fillPolygon(RellenarFlechaDerecha(new Point(_primero.getPosicionX()-10,_primero.getPosicionY()+(_primero.getAltoNodo()/2))));
		}
		
	}
	
	/**
	 * 
	 */
	private void crearCuerpo()throws Exception,Error  {
		
		_grafico.setColor(Color.BLACK);
		_grafico.drawRect(_posicionX,getPosicionYDato(),_anchoNodo,_altoNodo/2);
		_grafico.setColor(new Color (2,21,42));
		_grafico.fillRect(_posicionX+1,getPosicionYDato()+1,_anchoNodo-1,(_altoNodo/2)-1);
		
		
	}
	
	/**
	 * 
	 */
	private void crearCentinela()throws Exception,Error  {
		_grafico.setColor(Color.BLACK);
		_grafico.drawRect(_posicionX,_posicionY,_anchoNodo,_altoNodo/4);
		_grafico.setColor(new Color (101,163,38));
		_grafico.fillRect(_posicionX+1,_posicionY+1,_anchoNodo-1,(_altoNodo/4)-1);
		_grafico.setColor(Color.BLACK);
		_grafico.drawString("Centinela",getXTextoSiguiente (), getYTextoSiguiente());
		
	}
	
	/**
	 * @return
	 */
	public int getPosicionX() {
		return _posicionX;
	}
	
	/**
	 * @param posicionX
	 */
	public void setPosicionX(int posicionX) {
		_posicionX = posicionX;
	}
	
	/**
	 * @return
	 */
	public int getPosicionY() {
		return _posicionY;
	}
	
	/**
	 * @param posicionY
	 */
	public void setPosicionY(int posicionY) {
		_posicionY = posicionY;
	}
	
	/**
	 * @return
	 */
	public int getAnchoNodo() {
		return _anchoNodo;
	}
	
	/**
	 * @return
	 */
	public int getAltoNodo() {
		return _altoNodo;
	}

	/**
	 * @return
	 */
	private int getPosicionYDato()
	{
		return (_altoNodo/4)+_posicionY;
	}
	
	/**
	 * @return
	 */
	private int getXTextoSiguiente()
	{
		return (_anchoNodo/4)+_posicionX-8;
	}
	
	/**
	 * @return
	 */
	private int getYTextoSiguiente()
	{
		return (_altoNodo/7)+_posicionY+3;
	}
	
	/**
	 * @param siguiente
	 */
	public void setSiguiente(NodoDibujo siguiente) {
		_primero=siguiente;
	}
	
	/**
	 * @param centro
	 * @return
	 */
	private Polygon RellenarFlechaArriba(Point centro)throws Exception,Error  {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x-(radio*Math.sin(i*alfa))),(int)(centro.y-(radio*Math.cos(i*alfa))));
		
		return flecha;
	}
	
	/**
	 * @param centro
	 * @return
	 */
	private Polygon RellenarFlechaDerecha(Point centro)throws Exception,Error  {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x+(radio*Math.cos(i*alfa))),(int)(centro.y+(radio*Math.sin(i*alfa))));
		
		return flecha;
	}
	
}
